#include <functional>
#include <iostream>
#include <boost/asio.hpp>
#include <chrono>

void print(const boost::system::error_code& /*e*/,
    boost::asio::steady_timer* timer, int* count)
{
    if (*count < 5)
    {
        std::cout << *count << std::endl;
        ++(*count);

        std::cout << std::chrono::system_clock::now() << " ";

        timer->expires_at(timer->expiry() + boost::asio::chrono::seconds(1));
        timer->async_wait(std::bind(print,
              boost::asio::placeholders::error, timer, count));
    }
}

int main()
{
    boost::asio::io_context io;

    int count = 0;
    boost::asio::steady_timer t(io, boost::asio::chrono::seconds(1));

    // async_wait 的 handler 签名为 void (boost::system::error_code)，如果要传递额外的参数，就得用 bind。不妨修改一下 Print，让它每隔一秒打印一次计数，从 0 递增到 3。
    t.async_wait(std::bind(&print, std::placeholders::_1, &t, &count));
    // 本来print的函数声明为 void print(const boost::system::error_code& , boost::asio::steady_timer *, int* )
    // 通过bind得到的是void print(const boost::system::error_code&), 调用的时候会补充其他的参数.

    io.run();

    std::cout << "Final count is " << count << std::endl;

    return 0;
}